﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace CS424_9pts.Control
{
    public partial class ShoppingCart
    {
        public CarManagementEntities storeDB = new CarManagementEntities();

        string ShoppingCartId { get; set; }

        public const string CartSessionKey = "CartId";


        public void AddToCart(CarModel carModel)
        {
            // Get the matching cart and album instances
            var cartItem = storeDB.Cars.SingleOrDefault(c => c.CartId == ShoppingCartId && c.CarModel == carModel.ModelID);
            if (cartItem == null)
            {
                // Create a new cart item if no cart item exists
                cartItem = new Car
                {
                    CarModel = carModel.ModelID,
                    CartId = ShoppingCartId,
                    Count = 1,
                    DateCreated = DateTime.Now
                };

                storeDB.Cars.AddObject(cartItem);
            }
            else
            {
                // If the item does exist in the cart, then add one to the quantity
                cartItem.Count++;
            }
            // Save changes
            storeDB.SaveChanges();
        }

        public int RemoveFromCart(int id)
        {
            // Get the cart
            var cartItem = storeDB.Cars.Single(
                cart => cart.CartId == ShoppingCartId
                && cart.CarID == id);

            int itemCount = 0;

            if (cartItem != null)
            {
                //if (cartItem.Count > 1)
                //{
                //    cartItem.Count--;
                //    itemCount = (int)cartItem.Count;
                //}
                //else
                {
                    storeDB.Cars.DeleteObject(cartItem);
                }

                // Save changes
                storeDB.SaveChanges();
            }

            return itemCount;
        }

        public void EmptyCart()
        {
            var cartItems = storeDB.Cars.Where(cart => cart.CartId == ShoppingCartId);

            foreach (var cartItem in cartItems)
            {
                storeDB.Cars.DeleteObject(cartItem);
            }

            // Save changes
            storeDB.SaveChanges();
        }

        public List<Car> GetCartItems()
        {
            return storeDB.Cars.Where(cart => cart.CartId == ShoppingCartId).ToList();
        }

        public int GetCount()
        {
            // Get the count of each item in the cart and sum them up
            int? count = (from cartItems in storeDB.Cars
                          where cartItems.CartId == ShoppingCartId
                          select (int?)cartItems.Count).Sum();

            // Return 0 if all entries are null
            return count ?? 0;
        }

        public double GetTotal()
        {
            // Multiply album price by count of that album to get the current price for each of those albums in the cart
            //sum all album price totals to get the cart total
            double? total = (from cartItems in storeDB.Cars
                             join m in storeDB.CarModels on cartItems.CarModel equals m.ModelID
                             where cartItems.CartId == ShoppingCartId
                             select (int?)cartItems.Count * m.Price).Sum();
            return total??20;
        }

        //public int CreateOrder(Order order)
        //{
        //    decimal orderTotal = 0;

        //    var cartItems = GetCartItems();

        //    // Iterate over the items in the cart, adding the order details for each
        //    foreach (var item in cartItems)
        //    {
        //        var orderDetails = new OrderDetail
        //        {
        //            AlbumId = item.AlbumId,
        //            OrderId = order.OrderId,
        //            UnitPrice = item.Album.Price,
        //            Quantity = item.Count
        //        };

        //        // Set the order total of the shopping cart
        //        orderTotal += (item.Count * item.Album.Price);
        //    }

        //    // Set the order's total to the orderTotal count
        //    order.Total = orderTotal;

        //    // Save the order
        //    storeDB.SaveChanges();

        //    // Empty the shopping cart
        //    EmptyCart();

        //    // Return the OrderId as the confirmation number
        //    return order.OrderId;
        //}

        // We're using HttpContextBase to allow access to cookies.
        public string GetCartId(HttpContextBase context)
        {
            if (context.Session[CartSessionKey] == null)
            {
                if (!string.IsNullOrWhiteSpace(context.User.Identity.Name))
                {
                    context.Session[CartSessionKey] = context.User.Identity.Name;
                }
                else
                {
                    // Generate a new random GUID using System.Guid class
                    Guid tempCartId = Guid.NewGuid();

                    // Send tempCartId back to client as a cookie
                    context.Session[CartSessionKey] = tempCartId.ToString();
                }
            }

            return context.Session[CartSessionKey].ToString();
        }

        // When a user has logged in, migrate their shopping cart to
        // be associated with their username
        public void MigrateCart(string userName)
        {
            var shoppingCart = storeDB.Cars.Where(c => c.CartId == ShoppingCartId);

            foreach (Car item in shoppingCart)
            {
                item.CartId = userName;
            }
            storeDB.SaveChanges();
        }

        public void SetCartID(string session)
        {
            this.ShoppingCartId = session;
        }
    }
}